package main

import (
	"bufio"
	"fmt"
	"os"
	"regexp"
	"strconv"
	"strings"
)

// 定义一个结构体来存储 NPU 的信息
type NPUInfo2 struct {
	Chip          int
	Device        int
	Name          string
	Health        string
	BusId         string
	AICore        float64
	Temp          int
	MemoryUsageMB struct {
		Used  int
		Total int
	}
}

func main3() {
	// 打开文件
	file, err := os.Open("./gpu_demo/demo2.txt")
	if err != nil {
		panic(err)
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {

		}
	}(file)

	// 创建一个切片来存储所有 NPU 的信息
	var npus []NPUInfo2

	// 创建一个扫描器来读取文件内容
	scanner := bufio.NewScanner(file)

	// 定义正则表达式来匹配表格的标题行和数据行
	titleRegex := regexp.MustCompile(`\| +NPU +Name +`)
	dataRegex := regexp.MustCompile(`\| +\d +[a-zA-Z0-9]+ +.*`)

	// 定义是否已经读取到数据的标志
	isData := false

	// 遍历每一行
	for scanner.Scan() {
		line := scanner.Text()

		// 如果匹配到标题行，设置数据读取标志
		if titleRegex.MatchString(line) {
			isData = true
			continue
		}

		// 如果匹配到数据行，解析数据
		if isData && dataRegex.MatchString(line) {
			// 清理行数据并分割为字段
			cleanedLine := strings.ReplaceAll(line, "|", "")
			fields := strings.Fields(cleanedLine)

			// 解析字段
			npu := parseNPUInfo(fields)
			npus = append(npus, npu)
		}

		// 如果匹配到表格的分隔行，重置数据读取标志
		if strings.Contains(line, "+=====+") {
			isData = false
		}
	}

	// 打印解析到的 NPU 信息
	for _, npu := range npus {
		fmt.Printf("NPU Chip: %d, Device: %d\n", npu.Chip, npu.Device)
		fmt.Printf("  Name: %s, Health: %s, BusId: %s\n", npu.Name, npu.Health, npu.BusId)
		fmt.Printf("  AICore: %.1f%%, Temp: %d°C\n", npu.AICore, npu.Temp)
		fmt.Printf("  Memory Usage: %d MB / %d MB\n", npu.MemoryUsageMB.Used, npu.MemoryUsageMB.Total)
	}
}

// 解析一行数据为 NPUInfo 结构
func parseNPUInfo(fields []string) NPUInfo2 {
	// 初始化一个 NPUInfo 结构体
	npu := NPUInfo2{}

	// 解析 Chip 和 Device
	if len(fields) >= 2 {
		npu.Chip, _ = strconv.Atoi(fields[0])
		npu.Device, _ = strconv.Atoi(fields[1])
	}

	// 解析 Name 和 Health
	if len(fields) >= 4 {
		nameIndex := 2
		for i := nameIndex; i < len(fields); i++ {
			if fields[i] == "OK" || fields[i] == "NOT_OK" {
				break
			}
			npu.Name += fields[i] + " "
		}
		npu.Name = strings.TrimSpace(npu.Name)
		npu.Health = fields[len(fields)-1]
	}

	// 解析 BusId
	if len(fields) >= 7 {
		npu.BusId = fields[6]
	}

	// 解析 AICore Usage 和 Temperature
	if len(fields) >= 4 && len(fields) >= 5 {
		aicoreUsage, _ := strconv.ParseFloat(strings.TrimSuffix(fields[3], "%"), 64)
		npu.AICore = aicoreUsage

		temp, err := strconv.Atoi(strings.TrimSuffix(fields[4], "C"))
		if err == nil {
			npu.Temp = temp
		}
	}

	// 解析 Memory Usage
	if len(fields) >= 8 && len(fields) >= 9 {
		usedMemory, _ := strconv.Atoi(strings.TrimSuffix(fields[7], "MB"))
		totalMemory, _ := strconv.Atoi(strings.TrimSuffix(fields[8], "MB"))

		// 检查字段是否正确解析
		if usedMemory > 0 && totalMemory > 0 {
			npu.MemoryUsageMB.Used = usedMemory
			npu.MemoryUsageMB.Total = totalMemory
		}
	}

	return npu
}
